package com.bdqn;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Sj03 {
    public static void main(String[] args) {
        try {
            Class clz = Class.forName("com.bdqn.Person");
            //根据方法名和参数列表获取static final int getAge()方法
            //没有参数可以不写或用null表示
            try {
                Method getAge = clz.getDeclaredMethod("getAge",null);
                getAge.setAccessible(true);
                //调用get方法并传参，没有参数可以不写或用null表示
                //getAge方法为静态方法，调用时可以不指定具体Person实例
                try {
                    Object returnAge = getAge.invoke(null,null);
                    System.out.println("年龄是："+returnAge);
                    try {
                        Object person = clz.newInstance();      //创建Person实例
                        //根据方法名和参数列表获取private void silentMethod方法
                        //没有参数可以不写或用null表示
                        Method silentMethod = clz.getDeclaredMethod("silentMethod",null);
                        //silentMethod方法为private,这里已经超出其范围，不能直接访问
                        //通过setAccessible方法，设定为可以访问
                        silentMethod.setAccessible(true);
                        //调用silentMethod方法并传参，没有参数可以不写或null表示
                        silentMethod.invoke(person,null);
                        //根据方法名和参数列表获取 public void setName(String)方法
                        Method setName = clz.getDeclaredMethod("setName", String.class);
                        //setName方法为public，这里可以直接访问
                        //调用setName方法并传参
                        setName.invoke(person,"New Person");
                        //验证一下结果，调用public String getName()方法得到name的值
                        Object returnName = clz.getDeclaredMethod("getName").invoke(person);
                        System.out.println("刚才设定的name是："+returnName);
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
